package com.cy.shop.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component //将当前类的对象的创建使用和维护交由Spring容器维护
@Aspect //将当前类标记为切面类
public class TimerAspect {

    //ProceedingJoinPoint接口表示指向目标方法的对象
    //切入点表达式解析
    // 第一个*表示不关注方法返回值
    //第二个* com.cy.shop.service.impl.* 表示包下的哪个实现类也不关注
    //第三个* 表示哪个方法名字也不关注
    //第四个(..)表示哪个方法中的参数列表也不关注
    //"execution(* com.cy.shop.service.impl.*.*(..))"
    /*将当前环绕通知映射到某个页面上（指定连接点）*/
    @Around("execution(* com.cy.shop.service.impl.*.*(..))")
    /*ProceedingJoinPoint该接口表示连接点*/
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        // 先记录当前时间
        long start = System.currentTimeMillis();

       Object result = pjp.proceed(); //调用目标方法

//        后记录当前时间
        long end = System.currentTimeMillis();
        System.out.println("耗时: " + (end-start));
       return result;
    }
}
